/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Dato.DAO;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import transervfx.Dato.Entidad.Cliente;
import transervfx.Dato.Entidad.Fisico;

/**
 *
 * @author oscar
 */
public class ClienteFisicoDAO implements Dao<Fisico, Long> {

    private static ClienteFisicoDAO INSTANCE = null;

    /**
     * Crea el Gestor Auxiliar
     */
    protected ClienteFisicoDAO() {
    }

    /**
     * creador sincronizado para protegerse de posibles problemas multi-hilo
     * otra prueba para evitar instanciaciÃ³n mÃºltiple
     */
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ClienteFisicoDAO();
        }
    }

    /**
     * Obtiene la instancia.
     *
     * @return devuelve la instancia del "GestorAuxiliar".
     */
    public static ClienteFisicoDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }

    @Override
    public void persist(Fisico entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                em.persist(entity);
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    @Override
    public void remove(Fisico entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                System.out.println("ESTAS POR ELIMIAR");
                entity = em.getReference(Fisico.class, entity.getId());
                em.remove(entity);
                System.out.println("LO ELIMINA");
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    @Override
    public void update(Fisico entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {


            em.getTransaction().begin();
            System.out.println("Entra a modificar el repartidor");
            em.merge(entity);

            em.getTransaction().commit();
            System.out.println("Lo modifica al repartidor");

        } finally {
            em.close();
        }
    }
//parece que guarda bien, lo que me falta ver es como acomodar ese temite del metodo ese, es por esto que esta seteando al ini mal

    @Override
    public Fisico findById(Long id) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.getReference(Fisico.class, id);

        } finally {
            em.close();
        }
    }

    @Override
    public List<Fisico> findAll() {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.createNamedQuery("Fisico.findAll").getResultList();

        } finally {
            em.close();
        }
    }

    public Fisico findByCompleto(Fisico clienteFisicoSeleccionado) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            //poner find no reference
            clienteFisicoSeleccionado = em.find(Fisico.class, clienteFisicoSeleccionado.getId());


            clienteFisicoSeleccionado.getDomicilio();
            if (!clienteFisicoSeleccionado.getLugaresPersonalesFrecuentes().isEmpty()) {
                clienteFisicoSeleccionado.getLugaresPersonalesFrecuentes().get(0);
            }
            return clienteFisicoSeleccionado;

        } finally {
            em.close();
        }
    }

    public Fisico findByNroDoc(Integer nroDoc) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            Query query = em.createNamedQuery("Fisico.findByNroDoc");
            query.setParameter("nroDoc", nroDoc);
            if (query.getResultList().isEmpty()) {
                return null;
            }
            return (Fisico) query.getResultList().get(0);
        } finally {
            em.close();
        }
    }

    public Fisico findByTipoDocAndNroDoc(String tipoDoc, Integer nroDoc) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {


            Query query = em.createNamedQuery("Fisico.findByTipoDocAndNroDoc");
            query.setParameter("tipoDoc", tipoDoc);
            query.setParameter("nroDoc", nroDoc);

            List<Fisico> lr = query.getResultList();
            if (lr.size() > 0) {
                return lr.get(0);
            } else {
                return null;
            }


        } finally {
            em.close();
        }
    }

    public List<Fisico> findByTipoDoc(String tipoDoc) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {



            Query query = em.createNamedQuery("Fisico.findByTipoDoc");
            query.setParameter("tipoDoc", tipoDoc);
            return query.getResultList();

        } finally {
            em.close();
        }
    }

    public List<Fisico> findByNombresAndApellido(String nombres, String apellido) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            Query query = em.createNamedQuery("Fisico.findByNombresAndApellido");
            query.setParameter("nombres", nombres);
            query.setParameter("apellido", apellido);

            return query.getResultList();

        } finally {
            em.close();
        }
    }

    public Boolean poseeDeuda(Fisico clienteFisicoSeleccionado) {

        // FALTA HACER, LO DEJE PORQUE QUERIA HABLARLO, DE TODAS MANERAS NO DEBERIA ELIMINARSE 
        //UN CLIENTE QUE TUVIERA UNA DEUDA EN EL SISTEMA
        //SILVI: FIJATE EN EL CLIENTE JURIDICO, QUE IMPLEMENTE UNA, estoy teniendo un problema en un foreing key que despues le 
        //pregunto a oscar, pero seria algo como eso. 


        /* EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
         EntityManager em = emf.createEntityManager();
         try {
         Query query = em.createNamedQuery("Fisico.poseeDeuda");
         query.setParameter("deuda", deuda);
         if(query.getResultList().isEmpty()){
         return null;
         }
         return (Fisico) query.getResultList().get(0);
         } finally {
         em.close();
         }*/
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public List<Fisico> buscarPorFiltroRango(String apellido, String nombres, String tipoDocumento, Integer numeroDocumento, Integer cuit, String condicionIva, int ini, int fin) {
        System.out.println("Entra buscarPorFiltroRango");
        System.out.println("condicionIva: " + condicionIva);

        String consulta = "SELECT p FROM Fisico p";
        boolean hayotroParametro = false;

        if (!apellido.equals("") || !nombres.equals("") || !tipoDocumento.equals("") || numeroDocumento != null || cuit != null || !condicionIva.equals("")) {
            //lito

            //preguntar aca como saco esto de la zona ya qu eno es necesario aca
            consulta = "SELECT p FROM Fisico p  WHERE";
            //consulta = "SELECT p FROM Repartidor p WHERE";

            if (!apellido.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.apellido LIKE " + "'" + apellido + "%'";
                hayotroParametro = true;
            }
            if (!nombres.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.nombres LIKE " + "'" + nombres + "%'";


            }
            if (!tipoDocumento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.tipoDoc LIKE " + "'" + tipoDocumento + "'";

            }
            if (numeroDocumento != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.nroDoc =" + numeroDocumento;
            }
            if (cuit != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.cuit =" + cuit;
            }
            if (!condicionIva.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.condicionFrenteIva LIKE " + "'" + condicionIva + "'";
            }

        }
        System.out.println(consulta);

        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            Query query = em.createQuery(consulta);
            query.setFirstResult(ini);
            query.setMaxResults(fin);

            return (List<Fisico>) query.getResultList();

        } finally {
            em.close();
        }
    }

    public Long numeroDeClientesFisicosFiltrados(String apellido, String nombres, String tipoDocumento, Integer numeroDocumento, Integer cuit, String condicionIva) {
        System.out.println("Entra numeroDeClientesFisicosFiltrados");
        System.out.println("condicionIva: " + condicionIva);


        String consulta = "SELECT COUNT(p) FROM Fisico p ";

        boolean hayotroParametro = false;

        if (!apellido.equals("") || !nombres.equals("") || !tipoDocumento.equals("") || numeroDocumento != null || cuit != null || !condicionIva.equals("")) {
            consulta = "SELECT COUNT(p) FROM Fisico p WHERE";

            // consulta = "SELECT COUNT(p) FROM Repartidor p WHERE";
            if (!apellido.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.apellido LIKE " + "'" + apellido + "%'";
                hayotroParametro = true;
            }
            if (!nombres.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.nombres LIKE " + "'" + nombres + "%'";


            }
            if (!tipoDocumento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.tipoDoc LIKE " + "'" + tipoDocumento + "'";

            }
            if (numeroDocumento != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.nroDoc =" + numeroDocumento;

            }
            if (cuit != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.cuit =" + cuit;

            }
            //pero en la bd creo que habia de los dos
            if (!condicionIva.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.condicionFrenteIva LIKE " + "'" + condicionIva + "'";
            }
        }


        System.out.println(consulta);
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            Query query = em.createQuery(consulta);

            return (Long) query.getSingleResult();

        } finally {
            em.close();
        }
    }
}
